home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / osi / x500 / quipu-patches / kerberos / kerberos.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-27  |  2.7 KB  |  126 lines

  1. #include "quipu/config.h"
  2. #include "isoaddrs.h"
  3.  
  4. #ifdef KERBEROS
  5.  
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netdb.h>
  11. #include "quipu/bind.h"
  12. #include "UNIV-types.h"
  13.  
  14. int extdebug;
  15.  
  16. encode_kerberos_parms( pe, kp )
  17. PE            *pe;
  18. struct kerberos_parms    *kp;
  19. {
  20.     PE    tmppe = NULLPE;
  21.  
  22.     *pe = pe_alloc( PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SEQ );
  23.  
  24.     /* the DN */
  25.     (void) encode_IF_DistinguishedName( &tmppe, 0, 0, NULLCP, kp->kp_dn );
  26.     if ( tmppe == NULLPE )
  27.         return( NOTOK );
  28.     seq_add( *pe, tmppe, -1 );
  29.  
  30.     /* kerberos version */
  31.     tmppe = num2prim( kp->kp_version, PE_CLASS_UNIV, PE_PRIM_INT );
  32.     if ( tmppe == NULLPE )
  33.         return( NOTOK );
  34.     seq_add( *pe, tmppe, -1 );
  35.  
  36.     /* checksum + 1 - leave room for encryption */
  37.     tmppe = oct2prim( (char *) &(kp->kp_nonce), 8 );
  38.     if ( tmppe == NULLPE )
  39.         return( NOTOK );
  40.     seq_add( *pe, tmppe, -1 );
  41.  
  42.     /* kerberos credentials */
  43.     tmppe = oct2prim( (char *) kp->kp_ktxt.dat, kp->kp_ktxt.length );
  44.     if ( tmppe == NULLPE )
  45.         return( NOTOK );
  46.     seq_add( *pe, tmppe, -1 );
  47.  
  48.     return( OK );
  49. }
  50.  
  51. decode_kerberos_parms( pe, kp )
  52. PE            pe;
  53. struct kerberos_parms    **kp;
  54. {
  55.     PE    tmppe;
  56.     char    *p;
  57.     int    len;
  58.  
  59.     *kp = (struct kerberos_parms *)smalloc( sizeof(struct kerberos_parms) );
  60.  
  61.     /* the DN */
  62.     tmppe = first_member( pe );
  63.     if ( tmppe == NULLPE )
  64.         return( NOTOK );
  65.     if ( decode_IF_DistinguishedName( tmppe, 1, NULLIP, NULLVP,
  66.         &(*kp)->kp_dn ) == NOTOK )
  67.         return( NOTOK );
  68.  
  69.     /* kerberos version */
  70.     tmppe = next_member( pe, tmppe );
  71.     if ( tmppe == NULLPE )
  72.         return( NOTOK );
  73.     if ( ((*kp)->kp_version = prim2num( tmppe )) == NOTOK && pe->pe_errno
  74.         != PE_ERR_NONE )
  75.         return( NOTOK );
  76.  
  77.     /* checksum + 1 - leave room for encryption */
  78.     tmppe = next_member( pe, tmppe );
  79.     if ( tmppe == NULLPE )
  80.         return( NOTOK );
  81.     if ( (p = prim2str( tmppe, &len )) == NULL || len != 8 )
  82.         return( NOTOK );
  83.     memcpy( (char *) &(*kp)->kp_nonce, p, 8 );
  84.     free( p );
  85.  
  86.     /* kerberos parameters */
  87.     tmppe = next_member( pe, tmppe );
  88.     if ( tmppe == NULLPE )
  89.         return( NOTOK );
  90.     if ( (p = prim2str( tmppe, &len )) == NULL )
  91.         return( NOTOK );
  92.     memcpy( (char *) (*kp)->kp_ktxt.dat, p, len );
  93.     (*kp)->kp_ktxt.length = len;
  94.     free( p );
  95.  
  96.     return( OK );
  97. }
  98.  
  99. char *psap2hostname( pa )
  100. struct PSAPaddr    *pa;
  101. {
  102.     int        naddrs = pa->pa_addr.sa_addr.ta_naddr;
  103.     struct NSAPaddr    *na = pa->pa_addr.sa_addr.ta_addrs;
  104.     unsigned long    addr;
  105.     char        *p;
  106.     struct hostent    *hp;
  107.  
  108.     if ( na->na_stack != NA_TCP )
  109.         return( NULL );
  110.  
  111.     if ( (addr = inet_addr( na->na_domain )) == -1 ) {
  112.         hp = gethostbyname( na->na_domain );
  113.     } else {
  114.         hp = gethostbyaddr( (char *) &addr, sizeof(addr), AF_INET );
  115.     }
  116.     if ( hp == NULL )
  117.         return( NULL );
  118.  
  119.     if ( (p = strchr( hp->h_name, '.' )) != NULL )
  120.         *p = '\0';
  121.  
  122.     return( hp->h_name );
  123. }
  124.  
  125. #endif KERBEROS
  126.